Reactã®useLayoutEffectããã¯ã«é¢ããå æ¬çãªã¬ã€ãããã®åæçãªæ§è³ªããŠãŒã¹ã±ãŒã¹ãDOMã®æž¬å®ãšæŽæ°ã管çããããã®ãã¹ããã©ã¯ãã£ã¹ã«ã€ããŠè§£èª¬ããŸãã
React useLayoutEffect: åæçãªDOMã®æž¬å®ãšæŽæ°
Reactã¯ãã³ã³ããŒãã³ãã®å¯äœçšã管çããããã®åŒ·åãªããã¯ãæäŸããŠããŸããuseEffectã¯ã»ãšãã©ã®éåæãªå¯äœçšã«å¯Ÿå¿ããäž»åããã¯ã§ãããuseLayoutEffectã¯åæçãªDOMã®æž¬å®ãšæŽæ°ãå®è¡ããå¿
èŠãããå Žåã«åœ¹ç«ã¡ãŸãããã®ã¬ã€ãã§ã¯ãuseLayoutEffectãæ·±ãæãäžãããã®ç®çããŠãŒã¹ã±ãŒã¹ã广çãªäœ¿ç𿹿³ã«ã€ããŠèª¬æããŸãã
åæçãªDOMæŽæ°ã®å¿ èŠæ§ãçè§£ãã
useLayoutEffectã®è©³çްã«å
¥ãåã«ããªãåæçãªDOMæŽæ°ãæã
å¿
èŠã«ãªãã®ããçè§£ããããšãéèŠã§ãããã©ãŠã¶ã®ã¬ã³ããªã³ã°ãã€ãã©ã€ã³ã¯ãããã€ãã®ã¹ããŒãžã§æ§æãããŠããŸããããã«ã¯ä»¥äžãå«ãŸããŸãã
- HTMLã®è§£æ: HTMLããã¥ã¡ã³ããDOMããªãŒã«å€æããŸãã
- ã¬ã³ããªã³ã°: DOMå ã®åèŠçŽ ã®ã¹ã¿ã€ã«ãšã¬ã€ã¢ãŠããèšç®ããŸãã
- ãã€ã³ã: èŠçŽ ãç»é¢ã«æç»ããŸãã
Reactã®useEffectããã¯ã¯ããã©ãŠã¶ãç»é¢ããã€ã³ãããåŸã«éåæã§å®è¡ãããŸããããã¯äžè¬çã«ããã©ãŒãã³ã¹äžã®çç±ããæãŸããããšã§ããã¡ã€ã³ã¹ã¬ããããããã¯ããã®ãé²ãããã©ãŠã¶ã®å¿çæ§ãç¶æã§ããããã§ãããããããã©ãŠã¶ããã€ã³ãããåã«DOMãæž¬å®ãããã®æž¬å®å€ã«åºã¥ããŠããŠãŒã¶ãŒãåæã¬ã³ããªã³ã°ãèŠãåã«DOMãæŽæ°ããå¿
èŠãããç¶æ³ããããŸããäŸãšããŠã¯ä»¥äžã®ãããªãã®ããããŸãã
- ããŒã«ãããã®ã³ã³ãã³ããµã€ãºãšå©çšå¯èœãªç»é¢ã¹ããŒã¹ã«åºã¥ããŠããã®äœçœ®ã調æŽããã
- ã³ã³ããå ã«åãŸãããã«èŠçŽ ã®é«ããèšç®ããã
- ã¹ã¯ããŒã«ããªãµã€ãºäžã«èŠçŽ ã®äœçœ®ãåæãããã
ãããã®ã¿ã€ãã®æäœã«useEffectã䜿çšãããšããã©ãŠã¶ãåæç¶æ
ããã€ã³ãããåŸã«useEffectãå®è¡ãããŠDOMãæŽæ°ãããããèŠèŠçãªã¡ãã€ããäžå
·åãçºçããå¯èœæ§ããããŸããããã§useLayoutEffectãç»å ŽããŸãã
useLayoutEffectã®ç޹ä»
useLayoutEffectã¯useEffectã«äŒŒãReactããã¯ã§ããããã©ãŠã¶ããã¹ãŠã®DOMãã¥ãŒããŒã·ã§ã³ãå®è¡ããåŸãç»é¢ã«ãã€ã³ãããåã«åæçã«å®è¡ãããŸããããã«ãããèŠèŠçãªã¡ãã€ããåŒãèµ·ããããšãªãDOMã®æž¬å®å€ãèªã¿åããDOMãæŽæ°ããããšãã§ããŸããåºæ¬çãªæ§æã¯æ¬¡ã®ãšããã§ãã
import { useLayoutEffect } from 'react';
function MyComponent() {
useLayoutEffect(() => {
// DOMãã¥ãŒããŒã·ã§ã³ã®åŸããã€ã³ãåã«å®è¡ããã³ãŒã
// ãªãã·ã§ã³ã§ã¯ãªãŒã³ã¢ãã颿°ãè¿ã
return () => {
// ã³ã³ããŒãã³ããã¢ã³ããŠã³ããŸãã¯åã¬ã³ããªã³ã°ããããšãã«å®è¡ããã³ãŒã
};
}, [dependencies]);
return (
{/* ã³ã³ããŒãã³ãã®ã³ã³ãã³ã */}
);
}
useEffectãšåæ§ã«ãuseLayoutEffectã¯2ã€ã®åŒæ°ãåãåããŸãã
- å¯äœçšã®ããžãã¯ãå«ã颿°ã
- ãªãã·ã§ã³ã®äŸåé
åããšãã§ã¯ãã¯ãäŸåé¢ä¿ã®ããããã倿Žãããå Žåã«ã®ã¿åå®è¡ãããŸããäŸåé
åã空ïŒ
[]ïŒã®å Žåããšãã§ã¯ãã¯åæã¬ã³ããªã³ã°åŸã«äžåºŠã ãå®è¡ãããŸããäŸåé åãæå®ãããŠããªãå Žåããšãã§ã¯ãã¯æ¯åã®ã¬ã³ããªã³ã°åŸã«å®è¡ãããŸãã
useLayoutEffectã䜿çšããå Žé¢
useLayoutEffectããã€äœ¿çšããããçè§£ããéµã¯ããã©ãŠã¶ããã€ã³ãããåã«ãåæçã«DOMã®æž¬å®ãšæŽæ°ãè¡ãå¿
èŠãããç¶æ³ãç¹å®ããããšã§ãã以äžã«äžè¬çãªãŠãŒã¹ã±ãŒã¹ãããã€ã瀺ããŸãã
1. èŠçŽ ã®å¯žæ³ã枬å®ãã
ä»ã®èŠçŽ ã®ã¬ã€ã¢ãŠããèšç®ããããã«ãèŠçŽ ã®å¹
ãé«ãããŸãã¯äœçœ®ã枬å®ããå¿
èŠããããããããŸãããäŸãã°ãuseLayoutEffectã䜿çšããŠãããŒã«ããããåžžã«ãã¥ãŒããŒãå
ã«é
眮ãããããã«ããããšãã§ããŸãã
import React, { useState, useRef, useLayoutEffect } from 'react';
function Tooltip() {
const [isVisible, setIsVisible] = useState(false);
const tooltipRef = useRef(null);
const buttonRef = useRef(null);
useLayoutEffect(() => {
if (isVisible && tooltipRef.current && buttonRef.current) {
const buttonRect = buttonRef.current.getBoundingClientRect();
const tooltipWidth = tooltipRef.current.offsetWidth;
const windowWidth = window.innerWidth;
// ããŒã«ãããã®çæ³çãªäœçœ®ãèšç®
let left = buttonRect.left + (buttonRect.width / 2) - (tooltipWidth / 2);
// ããŒã«ãããããã¥ãŒããŒããã¯ã¿åºãå Žåã«äœçœ®ã調æŽ
if (left < 0) {
left = 10; // 巊端ããã®æå°ããŒãžã³
} else if (left + tooltipWidth > windowWidth) {
left = windowWidth - tooltipWidth - 10; // å³ç«¯ããã®æå°ããŒãžã³
}
tooltipRef.current.style.left = `${left}px`;
tooltipRef.current.style.top = `${buttonRect.bottom + 5}px`;
}
}, [isVisible]);
return (
{isVisible && (
ããã¯ããŒã«ãããã®ã¡ãã»ãŒãžã§ãã
)}
);
}
ãã®äŸã§ã¯ãuseLayoutEffectã䜿çšããŠããã¿ã³ã®äœçœ®ãšãã¥ãŒããŒãã®å¯žæ³ã«åºã¥ããŠããŒã«ãããã®äœçœ®ãèšç®ããŠããŸããããã«ãããããŒã«ããããåžžã«è¡šç€ºãããç»é¢ããã¯ã¿åºããªãããã«ãªããŸããgetBoundingClientRectã¡ãœããã¯ããã¥ãŒããŒãã«å¯Ÿãããã¿ã³ã®å¯žæ³ãšäœçœ®ãååŸããããã«äœ¿çšãããŸãã
2. èŠçŽ ã®äœçœ®ãåæããã
ãŠãŒã¶ãŒãã¹ã¯ããŒã«ããã®ã«åãããŠè¿œåŸããã¹ãã£ãããŒããããŒãªã©ãããèŠçŽ ã®äœçœ®ãå¥ã®èŠçŽ ãšåæãããå¿
èŠããããããããŸããããã®å ŽåããuseLayoutEffectã䜿çšããããšã§ããã©ãŠã¶ããã€ã³ãããåã«èŠçŽ ãæ£ããé
眮ãããããšãä¿èšŒããèŠèŠçãªäžå
·åãé¿ããããšãã§ããŸãã
import React, { useState, useRef, useLayoutEffect } from 'react';
function StickyHeader() {
const [isSticky, setIsSticky] = useState(false);
const headerRef = useRef(null);
const placeholderRef = useRef(null);
useLayoutEffect(() => {
const handleScroll = () => {
if (headerRef.current && placeholderRef.current) {
const headerHeight = headerRef.current.offsetHeight;
const headerTop = headerRef.current.offsetTop;
const scrollPosition = window.pageYOffset;
if (scrollPosition > headerTop) {
setIsSticky(true);
placeholderRef.current.style.height = `${headerHeight}px`;
} else {
setIsSticky(false);
placeholderRef.current.style.height = '0px';
}
}
};
window.addEventListener('scroll', handleScroll);
return () => {
window.removeEventListener('scroll', handleScroll);
};
}, []);
return (
ã¹ãã£ãããŒããããŒ
{/* ã¹ã¯ããŒã«çšã®ã³ã³ãã³ã */}
);
}
ãã®äŸã¯ããŠãŒã¶ãŒãã¹ã¯ããŒã«ããéã«ãã¥ãŒããŒãã®äžéšã«çãŸãã¹ãã£ãããŒããããŒãäœæããæ¹æ³ã瀺ããŠããŸããuseLayoutEffectã¯ãããããŒã®é«ããèšç®ããããããŒãã¹ãã£ãããŒã«ãªã£ããšãã«ã³ã³ãã³ãããžã£ã³ãããã®ãé²ãããã«ãã¬ãŒã¹ãã«ããŒèŠçŽ ã®é«ããèšå®ããããã«äœ¿çšãããŸããoffsetTopããããã£ã¯ãããã¥ã¡ã³ãã«å¯ŸããããããŒã®åæäœçœ®ã決å®ããããã«äœ¿çšãããŸãã
3. ãã©ã³ãèªã¿èŸŒã¿äžã®ããã¹ãã®ãžã£ã³ããé²ã
ãŠã§ããã©ã³ããèªã¿èŸŒãŸããŠããéããã©ãŠã¶ã¯æåã«ãã©ãŒã«ããã¯ãã©ã³ãã衚瀺ããããšããããã«ã¹ã¿ã ãã©ã³ããèªã¿èŸŒãŸãããšããã¹ãããªãããŒããåå ãšãªããŸããuseLayoutEffectã䜿çšããŠããã©ãŒã«ããã¯ãã©ã³ãã§ã®ããã¹ãã®é«ããèšç®ããã³ã³ããã®æå°é«ããèšå®ããããšã§ããžã£ã³ããé²ãããšãã§ããŸãã
import React, { useRef, useLayoutEffect, useState } from 'react';
function FontLoadingComponent() {
const textRef = useRef(null);
const [minHeight, setMinHeight] = useState(0);
useLayoutEffect(() => {
if (textRef.current) {
// ãã©ãŒã«ããã¯ãã©ã³ãã§é«ããæž¬å®
const height = textRef.current.offsetHeight;
setMinHeight(height);
}
}, []);
return (
ããã¯ã«ã¹ã¿ã ãã©ã³ãã䜿çšããããã¹ãã§ãã
);
}
ãã®äŸã§ã¯ãuseLayoutEffectããã©ãŒã«ããã¯ãã©ã³ãã䜿çšããŠæ®µèœèŠçŽ ã®é«ããæž¬å®ããŸãããã®åŸã芪divã®minHeightã¹ã¿ã€ã«ããããã£ãèšå®ããŠãã«ã¹ã¿ã ãã©ã³ããèªã¿èŸŒãŸãããšãã«ããã¹ãããžã£ã³ãããã®ãé²ããŸãããMyCustomFontããå®éã®ã«ã¹ã¿ã ãã©ã³ãåã«çœ®ãæããŠãã ããã
useLayoutEffect ãš useEffect ã®äž»ãªéã
useLayoutEffectãšuseEffectã®æãéèŠãªéãã¯ãå®è¡ã¿ã€ãã³ã°ã§ãã
useLayoutEffect: DOMãã¥ãŒããŒã·ã§ã³ã®åŸããã©ãŠã¶ããã€ã³ãããåã«åæçã«å®è¡ãããŸããããã«ããããšãã§ã¯ãã®å®è¡ãå®äºãããŸã§ãã©ãŠã¶ã®ãã€ã³ãããããã¯ãããŸããuseEffect: ãã©ãŠã¶ãç»é¢ããã€ã³ãããåŸã«éåæçã«å®è¡ãããŸããããã¯ãã©ãŠã¶ã®ãã€ã³ãããããã¯ããŸããã
useLayoutEffectã¯ãã©ãŠã¶ã®ãã€ã³ãããããã¯ãããããæ§ããã«äœ¿çšããå¿
èŠããããŸããuseLayoutEffectãé床ã«äœ¿çšãããšãç¹ã«ãšãã§ã¯ãã«è€éãŸãã¯æéã®ãããèšç®ãå«ãŸããŠããå Žåã«ãããã©ãŒãã³ã¹ã®åé¡ã«ã€ãªããå¯èœæ§ããããŸãã
以äžã¯ãäž»ãªéãããŸãšãã衚ã§ãã
| æ©èœ | useLayoutEffect |
useEffect |
|---|---|---|
| å®è¡ã¿ã€ãã³ã° | åæçïŒãã€ã³ãåïŒ | éåæçïŒãã€ã³ãåŸïŒ |
| ããããã³ã° | ãã©ãŠã¶ã®ãã€ã³ãããããã¯ãã | éããããã³ã° |
| ãŠãŒã¹ã±ãŒã¹ | åæå®è¡ãå¿ èŠãªDOMã®æž¬å®ãšæŽæ° | ãã®ä»ã®ã»ãšãã©ã®å¯äœçšïŒAPIåŒã³åºããã¿ã€ããŒãªã©ïŒ |
| ããã©ãŒãã³ã¹ãžã®åœ±é¿ | æœåšçã«ããé«ãïŒããããã³ã°ã®ããïŒ | ããäœã |
useLayoutEffectã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
useLayoutEffectã广çã«äœ¿çšããããã©ãŒãã³ã¹ã®åé¡ãé¿ããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããã
1. æ§ããã«äœ¿çšãã
åæçãªDOMã®æž¬å®ãšæŽæ°ã絶察ã«è¡ãå¿
èŠãããå Žåã«ã®ã¿useLayoutEffectã䜿çšããŠãã ããããã®ä»ã®ã»ãšãã©ã®å¯äœçšã«ã¯ãuseEffectãããè¯ãéžæã§ãã
2. ãšãã§ã¯ã颿°ãçãå¹ççã«ä¿ã€
useLayoutEffectå
ã®ãšãã§ã¯ã颿°ã¯ãããããã³ã°æéãæå°éã«æããããã«ãã§ããã ãçãå¹ççã«ããå¿
èŠããããŸãããšãã§ã¯ã颿°å
ã§ã®è€éãªèšç®ãæéã®ãããæäœã¯é¿ããŠãã ããã
3. äŸåé åãè³¢ã䜿çšãã
åžžã«useLayoutEffectã«äŸåé
åãæäŸããŠãã ãããããã«ããããšãã§ã¯ããå¿
èŠãªãšãã«ã®ã¿åå®è¡ãããããã«ãªããŸããã©ã®å€æ°ãäŸåé
åã«å«ããã¹ããæ
éã«æ€èšããŠãã ãããäžèŠãªäŸåé¢ä¿ãå«ãããšãäžå¿
èŠãªåã¬ã³ããªã³ã°ãããã©ãŒãã³ã¹ã®åé¡ã«ã€ãªããå¯èœæ§ããããŸãã
4. ç¡éã«ãŒããé¿ãã
useLayoutEffectå
ã§ããšãã§ã¯ãã®äŸåé¢ä¿ã§ãããç¶æ
倿°ãæŽæ°ããããšã§ç¡éã«ãŒããäœæããªãããã«æ³šæããŠãã ãããããã«ããããšãã§ã¯ããç¹°ãè¿ãåå®è¡ããããã©ãŠã¶ãããªãŒãºããå¯èœæ§ããããŸããDOMã®æž¬å®å€ã«åºã¥ããŠç¶æ
倿°ãæŽæ°ããå¿
èŠãããå Žåã¯ãrefã䜿çšããŠæž¬å®å€ãä¿åããç¶æ
ãæŽæ°ããåã«åã®å€ãšæ¯èŒããããšãæ€èšããŠãã ããã
5. ä»£æ¿æ¡ãæ€èšãã
useLayoutEffectã䜿çšããåã«ãåæçãªDOMæŽæ°ãå¿
èŠãšããªã代æ¿ãœãªã¥ãŒã·ã§ã³ããããã©ãããæ€èšããŠãã ãããäŸãã°ãJavaScriptã®ä»å
¥ãªãã«ç®çã®ã¬ã€ã¢ãŠããå®çŸããããã«CSSã䜿çšã§ããå ŽåããããŸããCSSã®ãã©ã³ãžã·ã§ã³ãã¢ãã¡ãŒã·ã§ã³ããuseLayoutEffectãå¿
èŠãšããã«ã¹ã ãŒãºãªèŠèŠå¹æãæäŸã§ããŸãã
useLayoutEffectãšãµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒ
useLayoutEffectã¯ãã©ãŠã¶ã®DOMã«äŸåããããããµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒäžã«äœ¿çšãããšèŠåã衚瀺ãããŸããããã¯ããµãŒããŒäžã§ã¯DOMãå©çšã§ããªãããã§ãããã®èŠåãé¿ããããã«ãæ¡ä»¶ä»ããã§ãã¯ã䜿çšããŠuseLayoutEffectãã¯ã©ã€ã¢ã³ããµã€ãã§ã®ã¿å®è¡ãããããã«ããããšãã§ããŸãã
import React, { useLayoutEffect, useEffect, useState } from 'react';
function MyComponent() {
const [isClient, setIsClient] = useState(false);
useEffect(() => {
setIsClient(true);
}, []);
useLayoutEffect(() => {
if (isClient) {
// DOMã«äŸåããã³ãŒã
console.log('useLayoutEffect running on the client');
}
}, [isClient]);
return (
{/* ã³ã³ããŒãã³ãã®ã³ã³ãã³ã */}
);
}
ãã®äŸã§ã¯ãuseEffectããã¯ã䜿çšããŠãã³ã³ããŒãã³ããã¯ã©ã€ã¢ã³ããµã€ãã§ããŠã³ããããåŸã«isClientç¶æ
倿°ãtrueã«èšå®ããŠããŸãããã®åŸãuseLayoutEffectããã¯ã¯isClientãtrueã®å Žåã«ã®ã¿å®è¡ããããµãŒããŒã§ã®å®è¡ãé²ããŸãã
å¥ã®ã¢ãããŒãã¯ãSSRäžã«useEffectã«ãã©ãŒã«ããã¯ããã«ã¹ã¿ã ããã¯ã䜿çšããããšã§ãã
import { useLayoutEffect, useEffect } from 'react';
const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;
export default useIsomorphicLayoutEffect;
ãããŠãuseLayoutEffectãuseEffectãçŽæ¥äœ¿çšãã代ããã«useIsomorphicLayoutEffectã䜿çšã§ããŸãããã®ã«ã¹ã¿ã ããã¯ã¯ãã³ãŒãããã©ãŠã¶ç°å¢ã§å®è¡ãããŠãããã©ããïŒã€ãŸãtypeof window !== 'undefined'ïŒããã§ãã¯ããŸããããããã§ããã°useLayoutEffectã䜿çšããããã§ãªããã°useEffectã䜿çšããŸããããã«ãããã¯ã©ã€ã¢ã³ããµã€ãã§useLayoutEffectã®åæçãªåäœã掻çšãã€ã€ãSSRäžã®èŠåãåé¿ã§ããŸãã
ã°ããŒãã«ãªèæ ®äºé ãšäŸ
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã察象ãšããã¢ããªã±ãŒã·ã§ã³ã§useLayoutEffectã䜿çšããå Žåãæ¬¡ã®ç¹ãèæ
®ããŠãã ããã
- ç°ãªããã©ã³ãã¬ã³ããªã³ã°: ãã©ã³ãã®ã¬ã³ããªã³ã°ã¯ãç°ãªããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããã©ãŠã¶ã§ç°ãªãå ŽåããããŸããã¬ã€ã¢ãŠã調æŽããã©ãããã©ãŒã éã§äžè²«ããŠæ©èœããããšã確èªããŠãã ãããæ§ã ãªããã€ã¹ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ã¢ããªã±ãŒã·ã§ã³ããã¹ãããäžäžèŽãç¹å®ããŠå¯ŸåŠããããšãæ€èšããŠãã ããã
- å³ããå·Šãžèšè¿°ããïŒRTLïŒèšèª: ã¢ããªã±ãŒã·ã§ã³ãRTLèšèªïŒäŸïŒã¢ã©ãã¢èªãããã©ã€èªïŒããµããŒãããŠããå ŽåãDOMã®æž¬å®ãšæŽæ°ãRTLã¢ãŒãã§ã®ã¬ã€ã¢ãŠãã«ã©ã®ããã«åœ±é¿ãããã«æ³šæããŠãã ãããç©ççãªããããã£ïŒäŸïŒ
margin-leftãmargin-rightïŒã®ä»£ããã«CSSè«çããããã£ïŒäŸïŒmargin-inline-startãmargin-inline-endïŒã䜿çšããŠãé©åãªã¬ã€ã¢ãŠãé©å¿ã確ä¿ããŠãã ããã - åœéåïŒi18nïŒ: ããã¹ãã®é·ãã¯èšèªã«ãã£ãŠå€§ããç°ãªãå ŽåããããŸããããã¹ãã³ã³ãã³ãã«åºã¥ããŠã¬ã€ã¢ãŠãã調æŽããéã¯ãç°ãªãèšèªã§ã®ããé·ããŸãã¯çãããã¹ãæååã®å¯èœæ§ãèæ ®ããŠãã ãããCSS flexboxãgridãªã©ã®æè»ãªã¬ã€ã¢ãŠãæè¡ã䜿çšããŠãæ§ã ãªããã¹ãé·ã«å¯Ÿå¿ããŠãã ããã
- ã¢ã¯ã»ã·ããªãã£ïŒa11yïŒ: ã¬ã€ã¢ãŠã調æŽãã¢ã¯ã»ã·ããªãã£ã«æªåœ±é¿ãäžããªãããã«ããŠãã ãããJavaScriptãç¡å¹ã«ãªã£ãŠããå ŽåãããŠãŒã¶ãŒãæ¯æŽæè¡ã䜿çšããŠããå Žåã«ã³ã³ãã³ãã«ã¢ã¯ã»ã¹ããããã®ä»£æ¿æ¹æ³ãæäŸããŠãã ãããARIA屿§ã䜿çšããŠãã¬ã€ã¢ãŠã調æŽã®æ§é ãšç®çã«é¢ããã»ãã³ãã£ãã¯ãªæ å ±ãæäŸããŠãã ããã
äŸïŒå€èšèªã³ã³ããã¹ãã§ã®åçã³ã³ãã³ãèªã¿èŸŒã¿ãšã¬ã€ã¢ãŠã調æŽ
ç°ãªãèšèªã®èšäºãåçã«èªã¿èŸŒããã¥ãŒã¹ãŠã§ããµã€ããæ³åããŠã¿ãŠãã ãããåèšäºã®ã¬ã€ã¢ãŠãã¯ãã³ã³ãã³ãã®é·ããšãŠãŒã¶ãŒã®å¥œã¿ã®ãã©ã³ãèšå®ã«åºã¥ããŠèª¿æŽããå¿
èŠããããŸãããã®ã·ããªãªã§useLayoutEffectãã©ã®ããã«äœ¿çšã§ãããã以äžã«ç€ºããŸãã
- èšäºã³ã³ãã³ãã®æž¬å®: èšäºã®ã³ã³ãã³ããèªã¿èŸŒãŸããŠã¬ã³ããªã³ã°ãããåŸïŒãã ã衚瀺ãããåïŒã
useLayoutEffectã䜿çšããŠèšäºã®ã³ã³ããã®é«ããæž¬å®ããŸãã - å©çšå¯èœãªã¹ããŒã¹ã®èšç®: ããããŒãããã¿ãŒããã®ä»ã®UIèŠçŽ ãèæ ®ããŠãç»é¢äžã®èšäºã«å©çšå¯èœãªã¹ããŒã¹ã決å®ããŸãã
- ã¬ã€ã¢ãŠãã®èª¿æŽ: èšäºã®é«ããšå©çšå¯èœãªã¹ããŒã¹ã«åºã¥ããŠãæé©ãªå¯èªæ§ã確ä¿ããããã«ã¬ã€ã¢ãŠãã調æŽããŸããäŸãã°ããã©ã³ããµã€ãºãè¡ã®é«ãããŸãã¯åã®å¹ ã調æŽããããšããããŸãã
- èšèªåºæã®èª¿æŽã®é©çš: èšäºãããé·ãããã¹ãæååãæã€èšèªã§ããå Žåãå¢å ããããã¹ãé·ã«å¯Ÿå¿ããããã«è¿œå ã®èª¿æŽãå¿ èŠã«ãªãå ŽåããããŸãã
ãã®ã·ããªãªã§useLayoutEffectã䜿çšããããšã§ããŠãŒã¶ãŒãèšäºãèŠãåã«ã¬ã€ã¢ãŠããé©åã«èª¿æŽãããããšãä¿èšŒããèŠèŠçãªäžå
·åãé²ããããè¯ãèªæžäœéšãæäŸã§ããŸãã
çµè«
useLayoutEffectã¯ãReactã§åæçãªDOMã®æž¬å®ãšæŽæ°ãè¡ãããã®åŒ·åãªããã¯ã§ããããããããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããããæ
éã«äœ¿çšããå¿
èŠããããŸããuseLayoutEffectãšuseEffectã®éããçè§£ãããã¹ããã©ã¯ãã£ã¹ã«åŸããã°ããŒãã«ãªåœ±é¿ãèæ
®ããããšã§ãuseLayoutEffectãæŽ»çšããŠã¹ã ãŒãºã§èŠèŠçã«é
åçãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãäœæã§ããŸãã
useLayoutEffectã䜿çšããéã¯ãããã©ãŒãã³ã¹ãšã¢ã¯ã»ã·ããªãã£ãåªå
ããããšãå¿ããªãã§ãã ãããåžžã«åæçãªDOMæŽæ°ãå¿
èŠãšããªã代æ¿ãœãªã¥ãŒã·ã§ã³ãæ€èšããæ§ã
ãªããã€ã¹ããã©ãŠã¶ã§ã¢ããªã±ãŒã·ã§ã³ã培åºçã«ãã¹ãããŠãã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«äžè²«ããæ¥œãããŠãŒã¶ãŒäœéšãæäŸããŠãã ããã